﻿using System;
using UniRx;

public static class UniRxOperatorExtensions
{
    /// <summary>
    /// T触发器。默认状态下直接输出输入的信号。
    /// 当 Control (控制流)输入信号时，停止信号输出。 Control (控制流)再次输出信号时，继续信号输出。
    /// </summary>
    public static IObservable<Tsource> ToggleTrigger<Tsource, Tcontrol>(this IObservable<Tsource> source, IObservable<Tcontrol> control)
    {
        return new ToggleTriggerObservable<Tsource, Tcontrol>(source, control);
    }

    /// <summary>
    /// D触发器。默认状态下直接输出输入的信号。
    /// 当 ControlOn （控制开启流）输入信号时，开启信号输出。当 ControlOff （控制关闭流）输入信号时，关闭信号输出。
    /// </summary>
    public static IObservable<Tsource> DifferentTrigger<Tsource, TControlOn, TControlOff>(this IObservable<Tsource> source, IObservable<TControlOn> controlOn, IObservable<TControlOff> controlOff)
    {
        return new DifferentTriggerObservable<Tsource, TControlOn, TControlOff>(source, controlOn, controlOff);
    }

    /// <summary>
    /// 抑制器。默认状态下直接输出输入的信号。
    /// 当 Control （控制流）输入信号时，阻止输出并打开计数器，当计数器结束时才继续输出。
    /// </summary>
    public static IObservable<Tsource> Suppressor<Tsource, TControl>(this IObservable<Tsource> source, IObservable<TControl> control, int count)
    {
        return new SuppressorObservable<Tsource, TControl, TControl>(source, control, count);
    }

    /// <summary>
    /// 抑制器。默认状态下直接输出输入的信号。
    /// 当 Control （控制流）输入信号时，阻止输出并打开计数器，当计数器结束时才继续输出。
    /// </summary>
    public static IObservable<Tsource> Suppressor<Tsource, TControlOn, TControlOff>(this IObservable<Tsource> source, IObservable<TControlOn> controlon, IObservable<TControlOff> controloff, int count)
    {
        return new SuppressorObservable<Tsource, TControlOn, TControlOff>(source, controlon, controloff, count);
    }

    /// <summary>
    /// 抑制器。默认状态下直接输出输入的信号。
    /// 当 Control （控制流）输入信号时，阻止输出并打开计时器，当计时器结束时才继续输出。
    /// </summary>
    public static IObservable<Tsource> Suppressor<Tsource, TControl>(this IObservable<Tsource> source, IObservable<TControl> control, TimeSpan dueTime)
    {
        return new SuppressorObservable<Tsource, TControl, TControl>(source, control, dueTime, Scheduler.DefaultSchedulers.TimeBasedOperations);
    }

    /// <summary>
    /// 抑制器。默认状态下直接输出输入的信号。
    /// 当 Control （控制流）输入信号时，阻止输出并打开计时器，当计时器结束时才继续输出。
    /// </summary>
    public static IObservable<Tsource> Suppressor<Tsource, TControlOn, TControlOff>(this IObservable<Tsource> source, IObservable<TControlOn> controlon, IObservable<TControlOff> controloff, TimeSpan dueTime)
    {
        return new SuppressorObservable<Tsource, TControlOn, TControlOff>(source, controlon, controloff, dueTime, Scheduler.DefaultSchedulers.TimeBasedOperations);
    }

    /// <summary>
    /// 从 Update 流转为 FixedUpdate 流
    /// </summary>
    public static IObservable<long> Fix(this IObservable<long> source)
    {
        return new FixObservable(source);
    }
}